package com.zzy.util.file;

import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UtilXml {
    public static void main(String args[]) {
        // readXML();
        String dir = System.getProperty("user.dir") + "\\provider-file\\src\\main\\resources\\xml\\";
        String src = dir + "writeTemp.xml";
        org.dom4j.Document doc = getDocument();
        weritXML01( src, doc);
    }

    //dom 模式读取
    public static void readXML() {
        Element element = null;
        // 可以使用绝对路劲
        String dir = System.getProperty("user.dir") + "\\provider-file\\src\\main\\resources\\xml\\";
        String src = dir + "readnode.xml";
        File f = new File(src);
        // documentBuilder为抽象不能直接实例化(将XML文件转换为DOM文件)
        DocumentBuilder db = null;
        DocumentBuilderFactory dbf = null;
        try {
            // 返回documentBuilderFactory对象
            dbf = DocumentBuilderFactory.newInstance();
            // 返回db对象用documentBuilderFatory对象获得返回documentBuildr对象
            db = dbf.newDocumentBuilder();
            // 得到一个DOM并返回给document对象
            Document dt = db.parse(f);
            // 得到一个elment根元素
            element = dt.getDocumentElement();
            // 获得根节点
            System.out.println("根元素：" + element.getNodeName());
            // 获得根元素下的子节点
            NodeList childNodes = element.getChildNodes();
            // 遍历这些子节点
            for (int i = 0; i < childNodes.getLength(); i++) {
                // 获得每个对应位置i的结点
                Node node1 = childNodes.item(i);
                if ("Account".equals(node1.getNodeName())) {
                    // 如果节点的名称为"Account"，则输出Account元素属性type
                    System.out.println("\r\n找到一篇账号， 所属区域: "
                            + node1.getAttributes().getNamedItem("type")
                            .getNodeValue() + "： ");
                    // 获得<Accounts>下的节点
                    NodeList nodeDetail = node1.getChildNodes();
                    // 遍历<Accounts>下的节点
                    for (int j = 0; j < nodeDetail.getLength(); j++) {
                        // 获得<Accounts>元素每一个节点
                        Node detail = nodeDetail.item(j);
                        if ("code".equals(detail.getNodeName())) { // 输出code
                            System.out.println("卡号: " + detail.getTextContent());
                        } else if ("pass".equals(detail.getNodeName())) { // 输出pass
                            System.out.println("密码: " + detail.getTextContent());
                        } else if ("name".equals(detail.getNodeName())) { // 输出name
                            System.out.println("姓名: " + detail.getTextContent());
                        } else if ("money".equals(detail.getNodeName())) { // 输出money
                            System.out.println("余额: " + detail.getTextContent());
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * SAX 模式  读取XML内容
     *
     * @param filesrc 要读取XML的地址
     * @return map[键是标签    值是标签的内容]
     */
    public static Map readXml(String filesrc) {
        //这里的 Document 和   Element 属于 org.dom4j.Document
        SAXReader reader = new SAXReader();
        Map map = new HashMap();
        try {
            // 读取XML文件
            org.dom4j.Document doc = reader.read(filesrc);
            org.dom4j.Element root = doc.getRootElement();
            List<org.dom4j.Element> param = root.elements();
            for (org.dom4j.Element e : param) {
                //e.getName()是标签 e.getText()是内容
                map.put(e.getName(), e.getText());
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return map;
    }


    /**
     * 字符串形式 	向XML文档中写入数据
     *
     * @param filesrc     要写入的XML的地址包括文件名字
     *                    D:\MyEclipse\workspace\TZZY\WebRoot\resources\xml\writeTemp.xml
     * @param documentstr 要写入的内容<root>I believe !</root>
     */
    public static void writeXml(String documentstr, String filesrc) {
        org.dom4j.Document documentStr = null;
        try {
            documentStr = DocumentHelper.parseText(documentstr);
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        XMLWriter writer = null;
        try {
            writer = new XMLWriter(new FileWriter(filesrc));
            writer.write(documentStr);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    /**
     * 非字符串 的 写入 XML 需要  组合 Document 对象
     *
     * @param docsrc    //要写入的地址包括文件名字
     *
     * @param doc 所要组合的 document 对象 在  getDocument() 有示例
     */
    public static void weritXML01(String docsrc, org.dom4j.Document doc) {
        FileWriter out = null;
        try {
            out = new FileWriter(docsrc);
            doc.write(out);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    /**
     * 非字符串 的 写入 XML 组合 Document 对象
     *
     * @return Document
     */
    public static org.dom4j.Document getDocument() {
        org.dom4j.Document documents = DocumentHelper.createDocument();
        //一级目录
        org.dom4j.Element root = documents.addElement("root");

        //在以及目录下添加二级目录
        org.dom4j.Element author1 = root.addElement("Lynch");
        //为目录添加属性
        author1.addAttribute("Age", "25");
        author1.addAttribute("Country", "China");
        //为目录添加内容
        author1.addText("I am great!");

        //添加为二级目录添加次级目录
        org.dom4j.Element author01 = author1.addElement("aaaa");
        author01.addText("I believe what belonging will come !");

        org.dom4j.Element author2 = root.addElement("Legend");
        author2.addAttribute("Age", "25");
        author2.addAttribute("Country", "China");
        author2.addText("I am great!too!");
        return documents;
    }

}